﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;

using MineLaunch.Setting;

namespace MineLaunch.Plugin
{
	public class PluginManager
	{
		private List<MLPlugin.PluginBase> PluginList = new List<MLPlugin.PluginBase>();

		/// <summary>
		/// プラグインを読み込む
		/// </summary>
		public void LoadPlugins()
		{
			string pluginsDirectory = Path.Combine(Directory.GetCurrentDirectory(), SettingsGlobal.PluginsDirectory);
			if (!Directory.Exists(pluginsDirectory))
			{
				Directory.CreateDirectory(pluginsDirectory);
			}
			string[] dllPathList = Directory.GetFiles(pluginsDirectory, "*.dll");
			foreach (string dllPath in dllPathList)
			{
				// DLLを読み込む
				Assembly assembly = Assembly.LoadFile(dllPath);
				if (assembly != null)
				{
					Type[] types = assembly.GetTypes();

					foreach (Type type in types)
					{
						// 型がクラスではない、プライベートクラス、抽象クラス、外部からアクセス出来ないクラスは除く
						if (!type.IsClass || type.IsNotPublic || type.IsAbstract || !type.IsVisible)
						{
							continue;
						}
						// PluginBaseを継承している場合はプラグインリストに追加する
						if (type.IsSubclassOf(typeof(MLPlugin.PluginBase)))
						{
							// インスタンスを生成
							object instance = Activator.CreateInstance(type);
							if (instance != null)
							{
								PluginList.Add(instance as MLPlugin.PluginBase);
							}
						}
					}
				}
			}
		}

		/// <summary>
		/// プラグイン一覧を取得
		/// </summary>
		/// <returns>プラグインリスト</returns>
		public List<MLPlugin.PluginBase> GetPluginList()
		{
			return PluginList;
		}
	}
}
